package br.com.afi.util.log.writer;

import java.text.MessageFormat;

/**
 * Interface responsável por definir os comportamentos de um LoggerWriter.
 *
 * @author André de Fontana Ignacio
 * @version 1.0
 */
public interface LoggerWriter {	
	
	/**
	 * Configura o Log, utilize esse método somente se o LoggerWriter for instânciado com um construtor sem argumentos.
	 * 
	 * @param clazz Classe
	 */
	void configure( Class<?> clazz );
	
	/**
	 * Configura o Log, utilize esse método somente se o LoggerWriter for instânciado com um construtor sem argumentos.
	 * 
	 * @param clazz Classe
	 */
	void configure( String name );
	
	/**
	 * Escreve com o Log em nível de DEBUG. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.debug("Usuário {0} salvo com sucesso", throwable, usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param t Throwable
	 * @param args Argumentos
	 */
	void debug( Object message, Throwable t, Object... args);
	
	/**
	 * Escreve com o Log em nível de DEBUG. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.debug("Usuário {0} salvo com sucesso", usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param args Argumentos
	 */
	void debug( Object message, Object... args );
	
	/**
	 * Escreve com o Log em nível de TRACE. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.debug("Usuário {0} salvo com sucesso", throwable, usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param t Throwable
	 * @param args Argumentos
	 */
	void trace( Object message, Throwable t, Object... args);
	
	/**
	 * Escreve com o Log em nível de TRACE. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.debug("Usuário {0} salvo com sucesso", usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param args Argumentos
	 */
	void trace( Object message, Object... args );

	/**
	 * Escreve com o Log em nível de ERROR. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.error("Usuário {0} salvo com sucesso", throwable, usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param t Throwable
	 * @param args Argumentos
	 */
	void error( Object message, Throwable t, Object... args );

	/**
	 * Escreve com o Log em nível de ERROR. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.error("Usuário {0} salvo com sucesso", usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param args Argumentos
	 */
	void error(Object message, Object... args);
	
	/**
	 * Escreve com o Log em nível de FATAL. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.fatal("Usuário {0} salvo com sucesso", throwable, usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param t Throwable
	 * @param args Argumentos
	 */
	void fatal(Object message, Throwable t, Object... args);

	/**
	 * Escreve com o Log em nível de FATAL. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.fatal("Usuário {0} salvo com sucesso", usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param args Argumentos
	 */
	void fatal(Object message, Object... args);
	
	/**
	 * Escreve com o Log em nível de INFO. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.info("Usuário {0} salvo com sucesso", throwable, usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param t Throwable
	 * @param args Argumentos
	 */
	void info(Object message, Throwable t, Object... args);

	/**
	 * Escreve com o Log em nível de INFO. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.info("Usuário {0} salvo com sucesso", usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param args Argumentos
	 */
	void info(Object message, Object... args);

	/**
	 * Escreve com o Log em nível de WARN. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.warn("Usuário {0} salvo com sucesso", throwable, usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param t Throwable
	 * @param args Argumentos
	 */
	void warn(Object message, Throwable t, Object... args);

	/**
	 * Escreve com o Log em nível de WARN. Utilize esse método do mesmo modo que um {@link MessageFormat}:
	 * 
	 * <code>
	 * log.warn("Usuário {0} salvo com sucesso", usuario.getCod());
	 * </code>
	 * 
	 * @param message Mensagem
	 * @param args Argumentos
	 */
	void warn(Object message, Object... args);
}
